gl: Make gdk_gl_context_make_current() return void
authorAlexander Larsson <alexl@redhat.com>
Thu, 9 Oct 2014 15:24:21 +0000 (17:24 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 13 Oct 2014 14:43:32 +0000 (10:43 -0400)
Its not really reasonable to handle failures to make_current, it
basically only happens if you pass invalid arguments to it, and
thats not something we trap on similar things on the X drawing side.

If GL is not supported that should be handled by the context creation
failing, and anything going wrong after that is essentially a critical
(or an async X error).

13 files changed:
gdk/gdkdisplay.c
gdk/gdkdisplayprivate.h
gdk/gdkgl.c
gdk/gdkglcontext.c
gdk/gdkglcontext.h
gdk/gdkwindow.c
gdk/wayland/gdkglcontext-wayland.c
gdk/wayland/gdkglcontext-wayland.h
gdk/x11/gdkglcontext-x11.c
gdk/x11/gdkglcontext-x11.h
gtk/gtkglarea.c
gtk/gtkglarea.h
tests/gtkgears.c

index f0c5e21398d658a3421e62c47979d165018dc49d..d6fd187692fe28d04a198e7025737c517732bc40 100644 (file)
@@ -2258,17 +2258,15 @@ gdk_display_destroy_gl_context (GdkDisplay   *display,
  *
  * Makes the given @context the current GL context, or unsets
  * the current GL context if @context is %NULL.
- *
- * Returns: %TRUE if successful
  */
-gboolean
+void
 gdk_display_make_gl_context_current (GdkDisplay   *display,
                                      GdkGLContext *context)
 {
   GdkGLContext *current = gdk_display_get_current_gl_context (display);
 
   if (current == context)
-    return TRUE;
+    return;
 
   if (context == NULL)
     g_object_set_data (G_OBJECT (display), "-gdk-gl-current-context", NULL);
@@ -2277,7 +2275,7 @@ gdk_display_make_gl_context_current (GdkDisplay   *display,
                             g_object_ref (context),
                             (GDestroyNotify) g_object_unref);
 
-  return GDK_DISPLAY_GET_CLASS (display)->make_gl_context_current (display, context);
+  GDK_DISPLAY_GET_CLASS (display)->make_gl_context_current (display, context);
 }
 
 /*< private >
index 65f134e9c2f896d4a3bf4d6515e93bce3fe1ae93..0cd45f856f78b6db0fedc344fba1488279a39acd 100644 (file)
@@ -225,7 +225,7 @@ struct _GdkDisplayClass
   gchar *                (*utf8_to_string_target)      (GdkDisplay     *display,
                                                         const gchar    *text);
 
-  gboolean              (*make_gl_context_current)  (GdkDisplay        *display,
+  void                  (*make_gl_context_current)  (GdkDisplay        *display,
                                                      GdkGLContext      *context);
   void                  (*destroy_gl_context)       (GdkDisplay        *display,
                                                      GdkGLContext      *context);
@@ -310,7 +310,7 @@ GdkWindow *         _gdk_display_create_window        (GdkDisplay       *display
 
 void                gdk_display_destroy_gl_context       (GdkDisplay        *display,
                                                           GdkGLContext      *context);
-gboolean            gdk_display_make_gl_context_current  (GdkDisplay        *display,
+void                gdk_display_make_gl_context_current  (GdkDisplay        *display,
                                                           GdkGLContext      *context);
 GdkGLContext *      gdk_display_get_current_gl_context   (GdkDisplay        *display);
 
index d9a93d9a50ef4f39014614c6eaa92375947161ea..90a3c1b131da979d19e4972cd561bfca667d88a7 100644 (file)
@@ -98,8 +98,7 @@ gdk_cairo_draw_from_gl (cairo_t              *cr,
 
   clip_region = gdk_cairo_region_from_clip (cr);
 
-  if (!gdk_gl_context_make_current (context))
-    g_error ("make current failed");
+  gdk_gl_context_make_current (context);
 
   glGenFramebuffersEXT (1, &framebuffer);
   glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, framebuffer);
index 9a5f457ef5cdf31988602993aa721da7d3a6cd70..5fbd90569f8677e2e2cbf0a6a51a017d99cda3db 100644 (file)
@@ -270,18 +270,16 @@ gdk_gl_context_flush_buffer (GdkGLContext *context,
  *
  * Makes the @context the current one.
  *
- * Returns: %TRUE if the context is current
- *
  * Since: 3.16
  */
-gboolean
+void
 gdk_gl_context_make_current (GdkGLContext *context)
 {
   GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
 
-  g_return_val_if_fail (GDK_IS_GL_CONTEXT (context), FALSE);
+  g_return_if_fail (GDK_IS_GL_CONTEXT (context));
 
-  return gdk_display_make_gl_context_current (gdk_window_get_display (priv->window), context);
+  gdk_display_make_gl_context_current (gdk_window_get_display (priv->window), context);
 }
 
 /**
index 9447723051cb2cbeaad73c6471c976ced25a6353..5dbd57e2c4f806ad25338bcf12b3796744c09616 100644 (file)
@@ -48,7 +48,7 @@ GDK_AVAILABLE_IN_3_16
 GdkWindow *             gdk_gl_context_get_window       (GdkGLContext *context);
 
 GDK_AVAILABLE_IN_3_16
-gboolean                gdk_gl_context_make_current     (GdkGLContext *context);
+void                    gdk_gl_context_make_current     (GdkGLContext *context);
 GDK_AVAILABLE_IN_3_16
 GdkGLContext *          gdk_gl_context_get_current      (void);
 GDK_AVAILABLE_IN_3_16
index 21eddf013e1abd759e50d867b7075fe85314dc70..6f76eb5dbc1412d8efa1e2e320fd1f12faa26302 100644 (file)
@@ -2887,13 +2887,14 @@ gdk_window_begin_paint_region (GdkWindow       *window,
       int wh = gdk_window_get_height (window) * gdk_window_get_scale_factor (window);
 
       context = gdk_window_get_paint_gl_context (window, NULL);
-      if (context == NULL || !gdk_gl_context_make_current (context))
+      if (context == NULL)
         {
           g_warning ("gl rendering failed, context: %p", context);
           window->current_paint.use_gl = FALSE;
         }
       else
         {
+         gdk_gl_context_make_current (context);
           /* With gl we always need a surface to combine the gl
              drawing with the native drawing. */
           needs_surface = TRUE;
@@ -3060,8 +3061,7 @@ gdk_window_end_paint (GdkWindow *window)
           cairo_region_subtract (opaque_region, window->current_paint.flushed_region);
           cairo_region_subtract (opaque_region, window->current_paint.need_blend_region);
 
-          if (!gdk_gl_context_make_current (window->gl_paint_context))
-            g_error ("make current failed");
+          gdk_gl_context_make_current (window->gl_paint_context);
 
           if (!cairo_region_is_empty (opaque_region))
             gdk_gl_texture_from_surface (window->current_paint.surface,
index b6f1e9974d7a5f5d50f8b05bbaadbcbe40599095..60d4de7bf803b0542a8f802236c5022c411356aa 100644 (file)
@@ -41,8 +41,7 @@ gdk_wayland_gl_context_update (GdkGLContext *context)
   GdkWindow *window = gdk_gl_context_get_window (context);
   int width, height;
 
-  if (!gdk_gl_context_make_current (context))
-    return;
+  gdk_gl_context_make_current (context);
 
   width = gdk_window_get_width (window);
   height = gdk_window_get_height (window);
@@ -76,10 +75,12 @@ gdk_wayland_window_invalidate_for_new_frame (GdkWindow      *window,
   egl_surface = gdk_wayland_window_get_egl_surface (window->impl_window,
                                                     context_wayland->egl_config);
 
-  if (display_wayland->have_egl_buffer_age &&
-      gdk_gl_context_make_current (window->gl_paint_context))
-    eglQuerySurface (display_wayland->egl_display, egl_surface,
-                     EGL_BUFFER_AGE_EXT, &buffer_age);
+  if (display_wayland->have_egl_buffer_age)
+    {
+      gdk_gl_context_make_current (window->gl_paint_context);
+      eglQuerySurface (display_wayland->egl_display, egl_surface,
+                      EGL_BUFFER_AGE_EXT, &buffer_age);
+    }
 
   invalidate_all = FALSE;
   if (buffer_age == 0 || buffer_age >= 4)
@@ -126,8 +127,7 @@ gdk_wayland_gl_context_flush_buffer (GdkGLContext *context,
   GdkWaylandGLContext *context_wayland = GDK_WAYLAND_GL_CONTEXT (context);
   EGLSurface egl_surface;
 
-  if (!gdk_gl_context_make_current (context))
-    return;
+  gdk_gl_context_make_current (context);
 
   egl_surface = gdk_wayland_window_get_egl_surface (window->impl_window,
                                                     context_wayland->egl_config);
@@ -391,7 +391,7 @@ gdk_wayland_display_destroy_gl_context (GdkDisplay   *display,
     }
 }
 
-gboolean
+void
 gdk_wayland_display_make_gl_context_current (GdkDisplay   *display,
                                              GdkGLContext *context)
 {
@@ -404,7 +404,7 @@ gdk_wayland_display_make_gl_context_current (GdkDisplay   *display,
     {
       eglMakeCurrent(display_wayland->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE,
                      EGL_NO_CONTEXT);
-      return TRUE;
+      return;
     }
 
   context_wayland = GDK_WAYLAND_GL_CONTEXT (context);
@@ -421,9 +421,7 @@ gdk_wayland_display_make_gl_context_current (GdkDisplay   *display,
                                                                context_wayland->egl_config);
     }
 
-  if (!eglMakeCurrent(display_wayland->egl_display, egl_surface,
-                      egl_surface, context_wayland->egl_context))
-    return FALSE;
-
-  return TRUE;
+  if (!eglMakeCurrent (display_wayland->egl_display, egl_surface,
+                      egl_surface, context_wayland->egl_context))
+    g_critical ("eglMakeCurrent failed");
 }
index 3d4fe37017b0f8dd28c696625457cab11beb2092..6a7d8797d8ccc2145c7356d7ef19276c8c6ae707 100644 (file)
@@ -57,7 +57,7 @@ void            gdk_wayland_window_invalidate_for_new_frame         (GdkWindow
                                                                      cairo_region_t    *update_area);
 void            gdk_wayland_display_destroy_gl_context              (GdkDisplay        *display,
                                                                      GdkGLContext      *context);
-gboolean        gdk_wayland_display_make_gl_context_current         (GdkDisplay        *display,
+void            gdk_wayland_display_make_gl_context_current         (GdkDisplay        *display,
                                                                      GdkGLContext      *context);
 
 G_END_DECLS
index 4fe2936f25b1d03700fa83f0735ec11139550a05..be187986535d461d74b07d554dd908b542128bbf 100644 (file)
@@ -96,8 +96,7 @@ gdk_x11_gl_context_update (GdkGLContext *context)
   GdkWindow *window = gdk_gl_context_get_window (context);
   int width, height;
 
-  if (!gdk_gl_context_make_current (context))
-    return;
+  gdk_gl_context_make_current (context);
 
   width = gdk_window_get_width (window);
   height = gdk_window_get_height (window);
@@ -155,10 +154,12 @@ gdk_x11_window_invalidate_for_new_frame (GdkWindow      *window,
 
   buffer_age = 0;
 
-  if (display_x11->has_glx_buffer_age &&
-      gdk_gl_context_make_current (window->gl_paint_context))
-    glXQueryDrawable(dpy, context_x11->drawable,
-                    GLX_BACK_BUFFER_AGE_EXT, &buffer_age);
+  if (display_x11->has_glx_buffer_age)
+    {
+      gdk_gl_context_make_current (window->gl_paint_context);
+      glXQueryDrawable(dpy, context_x11->drawable,
+                      GLX_BACK_BUFFER_AGE_EXT, &buffer_age);
+    }
 
   invalidate_all = FALSE;
   if (buffer_age == 0 || buffer_age >= 4)
@@ -826,7 +827,7 @@ gdk_x11_display_destroy_gl_context (GdkDisplay   *display,
     }
 }
 
-gboolean
+void
 gdk_x11_display_make_gl_context_current (GdkDisplay   *display,
                                          GdkGLContext *context)
 {
@@ -839,14 +840,11 @@ gdk_x11_display_make_gl_context_current (GdkDisplay   *display,
   if (context == NULL)
     {
       glXMakeContextCurrent (dpy, None, None, NULL);
-      return TRUE;
+      return;
     }
 
   context_x11 = GDK_X11_GL_CONTEXT (context);
 
-  if (context_x11->glx_context == NULL)
-    return FALSE;
-
   window = gdk_gl_context_get_window (context);
 
   // If the WM is compositing there is no particular need to delay
@@ -862,8 +860,6 @@ gdk_x11_display_make_gl_context_current (GdkDisplay   *display,
             g_print ("Making GLX context current to drawable %lu\n",
                      (unsigned long) context_x11->drawable));
 
-  gdk_x11_display_error_trap_push (display);
-
   glXMakeContextCurrent (dpy, context_x11->drawable, context_x11->drawable,
                          context_x11->glx_context);
 
@@ -874,14 +870,6 @@ gdk_x11_display_make_gl_context_current (GdkDisplay   *display,
       else
         glXSwapIntervalSGI (0);
     }
-
-  if (gdk_x11_display_error_trap_pop (display))
-    {
-      g_critical ("X Error received while calling glXMakeContextCurrent()");
-      return FALSE;
-    }
-
-  return TRUE;
 }
 
 /**
index 091783e143c0c2136dac4b55dd193effb9f7bce8..ae7bf2abd07f02442c081df132d2809ad32ff3ba 100644 (file)
@@ -66,7 +66,7 @@ void            gdk_x11_window_invalidate_for_new_frame         (GdkWindow
                                                                  cairo_region_t    *update_area);
 void            gdk_x11_display_destroy_gl_context              (GdkDisplay        *display,
                                                                  GdkGLContext      *context);
-gboolean        gdk_x11_display_make_gl_context_current         (GdkDisplay        *display,
+void            gdk_x11_display_make_gl_context_current         (GdkDisplay        *display,
                                                                  GdkGLContext      *context);
 
 G_END_DECLS
index 7b3ee28e90641c94932cd674932d69df6b9f50b3..bd8e894310a036369a9e1663ab86bb5fa579c80e 100644 (file)
@@ -219,15 +219,9 @@ gtk_gl_area_realize (GtkWidget *widget)
                                                 NULL);
   if (priv->context != NULL)
     {
-      if (gdk_gl_context_make_current (priv->context))
-       {
-         glGenFramebuffersEXT (1, &priv->framebuffer);
-         glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, priv->framebuffer);
-       }
-      else
-       {
-         g_warning ("Unable to make new context current");
-       }
+      gdk_gl_context_make_current (priv->context);
+      glGenFramebuffersEXT (1, &priv->framebuffer);
+      glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, priv->framebuffer);
     }
 }
 
@@ -239,8 +233,9 @@ gtk_gl_area_unrealize (GtkWidget *widget)
 
   if (priv->context != NULL)
     {
-      if (priv->framebuffer != 0 && gtk_gl_area_make_current (self))
+      if (priv->framebuffer != 0)
        {
+         gtk_gl_area_make_current (self);
          /* Bind 0, which means render to back buffer, as a result, fb is unbound */
          glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
          glDeleteFramebuffersEXT (1, &priv->framebuffer);
@@ -276,8 +271,7 @@ gtk_gl_area_draw (GtkWidget *widget,
   if (priv->context == NULL)
     return FALSE;
 
-  if (!gtk_gl_area_make_current (self))
-    return FALSE;
+  gtk_gl_area_make_current (self);
 
   scale = gtk_widget_get_scale_factor (widget);
   w = gtk_widget_get_allocated_width (widget) * scale;
@@ -332,8 +326,7 @@ gtk_gl_area_draw (GtkWidget *widget,
                               color_tex ? GL_TEXTURE : GL_RENDERBUFFER,
                               scale, 0, 0, w, h);
 
-      if (!gtk_gl_area_make_current (self))
-       g_error ("can't make old context current again");
+      gtk_gl_area_make_current (self);
     }
   else
     {
@@ -613,24 +606,20 @@ gtk_gl_area_get_context (GtkGLArea *area)
  * #GtkGLArea::render signal, and should not be called by
  * application code.
  *
- * Returns: %TRUE if the context was associated successfully with
- *  the widget
- *
  * Since: 3.16
  */
-gboolean
+void
 gtk_gl_area_make_current (GtkGLArea *area)
 {
   GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area);
   GtkWidget *widget;
 
-  g_return_val_if_fail (GTK_IS_GL_AREA (area), FALSE);
+  g_return_if_fail (GTK_IS_GL_AREA (area));
 
   widget = GTK_WIDGET (area);
-  g_return_val_if_fail (gtk_widget_get_realized (widget), FALSE);
 
-  if (priv->context == NULL)
-    return FALSE;
+  g_return_if_fail (gtk_widget_get_realized (widget));
 
-  return gdk_gl_context_make_current (priv->context);
+  if (priv->context)
+    gdk_gl_context_make_current (priv->context);
 }
index cb0d4c75c2e624ba0e64b4783b6e910bb7e02954..559389a029aae17c6937132d85e769883b9a8f04 100644 (file)
@@ -98,7 +98,7 @@ GDK_AVAILABLE_IN_3_16
 GdkGLContext *  gtk_gl_area_get_context         (GtkGLArea        *area);
 
 GDK_AVAILABLE_IN_3_16
-gboolean        gtk_gl_area_make_current        (GtkGLArea        *area);
+void            gtk_gl_area_make_current        (GtkGLArea        *area);
 
 G_END_DECLS
 
index f382c613cd0d860a6741b019d78dfad9c65332c9..232fd3c2d864c53cfcc2712cc579335e1dd1d524 100644 (file)
@@ -292,12 +292,7 @@ gtk_gears_size_allocate (GtkWidget     *widget,
 
   if (gtk_widget_get_realized (widget))
     {
-      if (!gtk_gl_area_make_current (glarea))
-        {
-          g_warning ("Unable to make gl context current");
-          return;
-        }
-
+      gtk_gl_area_make_current (glarea);
       reshape (allocation->width, allocation->height);
     }
 }
@@ -316,11 +311,7 @@ gtk_gears_realize (GtkWidget *widget)
 
   GTK_WIDGET_CLASS (gtk_gears_parent_class)->realize (widget);
 
-  if (!gtk_gl_area_make_current (glarea))
-    {
-      g_warning ("Unable to make gl context current");
-      return;
-    }
+  gtk_gl_area_make_current (glarea);
 
   glLightfv(GL_LIGHT0, GL_POSITION, pos);
   glEnable(GL_CULL_FACE);